package com.goldgov.utils;

import java.util.HashMap;
import java.util.Map;
import java.util.Set;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.alibaba.fastjson.JSONObject;

import cn.jiguang.common.ClientConfig;
import cn.jiguang.common.resp.APIConnectionException;
import cn.jiguang.common.resp.APIRequestException;
import cn.jpush.api.JPushClient;
import cn.jpush.api.push.PushResult;
import cn.jpush.api.push.model.Message;
import cn.jpush.api.push.model.Options;
import cn.jpush.api.push.model.Platform;
import cn.jpush.api.push.model.PushPayload;
import cn.jpush.api.push.model.audience.Audience;
import cn.jpush.api.push.model.notification.AndroidNotification;
import cn.jpush.api.push.model.notification.IosNotification;
import cn.jpush.api.push.model.notification.Notification;

/** 
 * @ClassName: JiguangPush 
 * @Description: 极光推送
 * @author hanxiangyu
 * @date 2018年8月9日 上午12:14:29 
 */
public class JiguangPush {
	
	 private static final Logger log = LoggerFactory.getLogger(JiguangPush.class);
     private static String masterSecret = "5646b75a498d3e001170c113";
     private static String appKey = "d980c7ebf988e573cd897885";
	 private static JPushClient jpushClient;
     
     static {
    	 ClientConfig clientConfig = ClientConfig.getInstance();
    	 jpushClient = new JPushClient(masterSecret, appKey, null, clientConfig);
     }
     
     /**
      * 推送通知
      * @date 2018年8月9日 上午12:27:54 
      * @author hanxiangyu
      * @param alias 通知人员
      * @param title 通知标题
      * @param content 通知内容
      * @param map 需要传入的一些参数
      * @return
      */
     public static PushResult push(String alias,String title, String content,Map<String, String> map){
    	 //所有平台，
    	 PushPayload payload = buildPushObject_all_alert(alias,title, content,map);
    	 try {
    		 return jpushClient.sendPush(payload);
    	 } catch (APIConnectionException e) {
    		 log.error("Connection error. Should retry later. ", e);
    		 return null;
    	 } catch (APIRequestException e) {
    		 log.error("Error response from JPush server. Should review and fix it. ", e);
    		 return null;
    	 }    
     }
     /**
      * 自定义消息推送通知 不在通知栏显示
      * @date 2018年8月9日 上午12:27:54 
      * @author hanxiangyu
      * @param alias 通知人员
      * @param title 通知标题
      * @param content 通知内容
      * @param map 需要传入的一些参数
      * @return
      */
     public static PushResult customPush(String alias,String title, String content,Map<String, String> map){
    	 //所有平台，
    	 PushPayload payload = custom_buildPushObject_android_and_ios(alias,title, content,map);
    	 try {
    		 return jpushClient.sendPush(payload);
    	 } catch (APIConnectionException e) {
    		 log.error("Connection error. Should retry later. ", e);
    		 return null;
    	 } catch (APIRequestException e) {
    		 log.error("Error response from JPush server. Should review and fix it. ", e);
    		 return null;
    	 }    
     }
	
     
     /**
 	 * 构建推送对象：所有平台，//一次传多个人
 	 * @date 2018年8月8日 下午11:49:18 
 	 * @author hanxiangyu
 	 * @param alias 通知人员
 	 * @param title 通知标题
 	 * @param content 通知内容
 	 * @param map 需要传入的一些参数
 	 * @return
 	 */
 	public static PushPayload buildPushObject_all_alias_alert(Set<String> alias,String title, String content,Map<String, String> map) {
 		return PushPayload.newBuilder().setPlatform(Platform.all())// 所有平台:Platform.all();
 				.setAudience(Audience.alias(alias))// 向选定的人推送(alias也可以是一个集合Set<String> alias)
// 				.setNotification(Notification.ios(content, map))// 消息内容
// 				.setNotification(Notification.android(content, title, map))
 				.setNotification(Notification.newBuilder()
                        .addPlatformNotification(AndroidNotification.newBuilder()
                                .addExtras(map)
                                .setTitle(title)
                                .setAlert(content)
                                .build())
                        .addPlatformNotification(IosNotification.newBuilder()
                        		.addExtras(map)
                                .setAlert(content)
                                .build())
                        .build())
 				.build();
 	}
 	
 	 /**
 	 * 构建推送对象：所有平台，//一次传一个人
 	 * @date 2018年8月8日 下午11:49:18 
 	 * @author hanxiangyu
 	 * @param alias 通知人员
 	 * @param title 通知标题
 	 * @param content 通知内容
 	 * @param map 需要传入的一些参数
 	 * @return
 	 */
 	public static PushPayload buildPushObject_all_alert(String alias,String title, String content,Map<String, String> map) {
 		return PushPayload.newBuilder().setPlatform(Platform.all())// 所有平台:Platform.all();
 				.setAudience(Audience.alias(alias))// 向选定的人推送(alias也可以是一个集合Set<String> alias)
// 				.setNotification(Notification.ios(content, map))// 消息内容
// 				.setNotification(Notification.android(content, title, map))
 				.setNotification(Notification.newBuilder()
 						.addPlatformNotification(AndroidNotification.newBuilder()
 								.addExtras(map)
 								.setTitle(title)
 								.setAlert(content)
 								.build())
 						.addPlatformNotification(IosNotification.newBuilder()
 								.addExtras(map)
 								.setAlert(content)
 								.build())
 						.build())
 				.build();
 	}
 	
 	 /**
 	 * 自定义推送构建推送对象：所有平台，//一次传一个人
 	 * @date 2018年8月8日 下午11:49:18 
 	 * @author hanxiangyu
 	 * @param alias 通知人员
 	 * @param title 通知标题
 	 * @param content 通知内容
 	 * @param map 需要传入的一些参数
 	 * @return
 	 */
    public static PushPayload custom_buildPushObject_android_and_ios(String alias,String title, String content,Map<String, String> map) {
        return PushPayload.newBuilder()
//        		Platform指定了哪些平台就会像指定平台中符合推送条件的设备进行推送。 
                .setPlatform(Platform.all())
                .setAudience(Audience.alias(alias))
//                设置推送内容 在通知栏显示
//                .setNotification(Notification.newBuilder()
//                        .setAlert(content)
//                        .addPlatformNotification(AndroidNotification.newBuilder()
////                                .setAlert(alias)
//                                .setTitle(title)
//                                //此字段为透传字段，不会显示在通知栏。用户可以通过此字段来做一些定制需求，如特定的key传要指定跳转的页面（value）
//                                .addExtras(map)
//                                .build()
//                        )
//                        .addPlatformNotification(IosNotification.newBuilder()
//                                //传一个IosAlert对象，指定apns title、title、subtitle等
////                                .setAlert(alias)
//                                //直接传alert
//                                //此项是指定此推送的badge自动加1
//                                .incrBadge(1)
//                                //此字段为透传字段，不会显示在通知栏。用户可以通过此字段来做一些定制需求，如特定的key传要指定跳转的页面（value）
//                                .addExtras(map)
//                                //此项说明此推送是一个background推送，想了解background看：http://docs.jpush.io/client/ios_tutorials/#ios-7-background-remote-notification
//                                .setContentAvailable(true)
//                                .build()
//                        )
//                        .build()
//                )
                //jpush的自定义消息，
                // sdk默认不做任何处理，不会有通知提示。
                .setMessage(Message.newBuilder()
                        .setMsgContent(content)
                        .setTitle(title)
                        .addExtras(map)
                        .build())
 
                .setOptions(Options.newBuilder()
                        //此字段的值是用来指定本推送要推送的apns环境，false表示开发，true表示生产；对android和自定义消息无意义
                        .setApnsProduction(true)
                        //此字段是给开发者自己给推送编号，方便推送者分辨推送记录
                        .setSendno(1)
                        //此字段的值是用来指定本推送的离线保存时长，如果不传此字段则默认保存一天，最多指定保留十天，单位为秒
                        .setTimeToLive(24*60*60*3)
                        .build()
                )
                .build();
    }
 	
 	
 	
 	
 	
// 	public static void main(String[] args) {
// 		String str = "太阳当空照，花儿对我笑。";
// 		String user = "hanxiangyu";
// 		Map<String, String> map = new HashMap<>();
// 		map.put("id", "086d24943094901bd1873920e4085b1b");
// 		map.put("noticeType", "12");
// 		map.put("noticeId", "be79e269-8afe-11e8-bb5f-0242ac130005");
// 		System.out.println(JSONObject.toJSONString(map));
// 		JiguangPush.push(user.replace("-", ""), "测试标题", str, map); //显示通知栏
// 		System.out.println("--------------------------------------");
// 		JiguangPush.customPush(user.replace("-", ""), "测试标题", str, map);//自定义通知不显示通知栏
//	}
}
